home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / Library / +ORC / Orc pac C / HOWTOC3.TXT < prev    next >
Encoding:
Text File  |  2000-05-25  |  58.9 KB  |  1,530 lines

  1.  
  2. HOWTOC3.TXT
  3.  
  4. [WINFORMANT] [INSTANT ACCESS]
  5.  
  6.             HOW TO CRACK, A TUTORIAL - LESSON C (3)
  7.                  by +ORC (the old red cracker)
  8.  
  9. --------------------------------------------------------
  10. LESSON C (3) -  How to crack Windows, cracking as anArt:
  11. Web trends, Instant Access (end) and the proximity trick
  12. --------------------------------------------------------
  13.  
  14. *IMPORTANT NOTICE*
  15. I had to divide Lesson C3 (this lesson) in three parts for
  16. anonymous sending: HOWTOC31.TXT; HOWTOC32.TXT and HOWTOC33.TXT.
  17. The three parts should be re-assembled before zipping them or
  18. htmizing them on the Web. I'm sending this on 1/12/96 to 5
  19. newsgroups and 8 pages. Work well. +ORC
  20.  
  21. I. [WEB TRENDS]
  22. It's really amazing: I began this tutorial in february 1996...
  23. the year is not yet finished but many things have already
  24. changed, and how! First of all the Web proves to be even more
  25. significant that I would ever have thought: it's -de facto- an
  26. ANTI-ESTABLISHMENT and ANTI-CONSUME "permanent" tool... more than
  27. that: it's an EVOLVING and SHARP tool! 
  28. I do not know if you will agree with me, but it seems to me that
  29. it is now NOT ANY MORE NECESSARY to buy any of the following
  30. things (and this is a quite incomplete list:
  31.  
  32. 1)   Newspapers     Are almost all on the Web for free
  33. 2)   Magazines      Are almost all on the Web for free
  34. 3)   Software       All on the Web for free
  35. 4)   Books          on the Web (even the *images* inside the
  36.                     books you would have bought are somewhere)
  37. 5)   Post_stamps    e-mail is free and ubiquitous
  38. 6)   Hard_disks     free megabytes everywhere on the Web (for
  39.                     pages and/or software, quite a lot of
  40.                     offering (at the moment, middle november
  41.                     1996 you can get -for free- about 80
  42.                     megabytes for each email address you have).
  43.                     Should you do not deem this space enough,
  44.                     you may multiply them -ad libitum- using one
  45.                     of the many free "alias e-mail addresses"
  46.                     generators or, as a brilliant scholar of
  47.                     mine (re)discovered, you may easily "caper"
  48.                     (the passwords of) pages established by the
  49.                     lusers.
  50.  
  51.      I assure you that I used to spend quite a lot of money
  52. buying all the preceding items. The case of the CD-ROM magazines
  53. (and of software in general) seems to me to be the most relevant.
  54. In my earlier lessons I advised you to buy CD-ROM software at
  55. "kilo" prices in second hand shops (obviously never when the
  56. magazines themselves do appear)... even this trick is now
  57. useless: there is NO software that you cannot find on the Web
  58. (I'll bet that the CD-ROM mags are not making any easy money any
  59. more now). This truth may be difficult to slurp until you learn
  60. HOW to search effectively on the Web, a very difficult art -per
  61. se-, that all real crackers should master. A little tip: if you
  62. are in a hurry do your searches  using your own search engines
  63. instead of using only the ubiquitous AltaVista, FTP and
  64. Webcrawler (which you SHOULD use, of course, but not alone).
  65.      And loo! Good old Internet, made by governments and
  66. universities with public money and no private partecipation
  67. whatsoever reveals itself to be the most striking revolution of
  68. the last years in spite of the continuous blah blah about free
  69. markets and private initiative... quite funny, isn't it?
  70.      New promising patterns are emerging: it is clear (to me)
  71. that the future of cracking lays in JavaScript applets: Netscape
  72. has opened quite a Pandora Box... now everybody is scrambling to
  73. close it... TOO LATE! Find the relevant documentation, tutorials,
  74. software, tools, examples... even teachers! Everything is there
  75. for free on the Web! Study it, and when you are ready study it
  76. again... take it easy: we have a long cracking future before
  77. us... 
  78.      Here is a nice example (by LaDue) of an interesting applet:
  79. this one forges an e-mail from the browsers of your page sending
  80. it to the address contained in the string "toMe". The browser of
  81. your page initiates the mail by connecting (involuntarily) to
  82. port 25 (int mailPort=25).
  83.      Now, let's just academically imagine... you would put your
  84. own address (faked email address but working depot when you need
  85. to fetch the messages, as usual) in the string "toMe"... well,
  86. scanning incoming mail you could get the full e-mail address,
  87. including the user name, of many people who have seen your page.
  88.      See LaDue example:
  89. <a href="http://www.math.gatech.edu/~mladue/PenPal.java">
  90. here</a>. 
  91.      JavaScript and Java are two completely different things: The
  92. coincidence in the name is only a stupid marketing move from
  93. Netscape. JavaScript is so easy it's a shame, and this makes it
  94. the ideal weapon for masscracking (Java on the countrary is a
  95. "real" programming language). The implications of easy Javascript
  96. use, of internet growth and of the "on the fly" JavaScript
  97. workings for the drafting of much more interesting applets are
  98. obvious, I'll let them to the intuition (and fantasy) of my
  99. cleverest readers.
  100.  
  101. II.[INSTANT ACCESS] End
  102.      I'll admit it: I am a little deceived: the +HCU strainer
  103. (Instant access protection scheme) has been solved only by very
  104. few (pretty competent) crackers. The amount of people that has
  105. NOT cracked instant access (and that as relentlessy asked for
  106. more "clues") stood in no sound relation to the very few that
  107. solved it. I intended to give my complete solution in this lesson
  108. C3 to allow everybody to have (good) software for free... but too
  109. few worked hard on it to let you all lazy ones deserve a "ready-
  110. made" solution... I will therefore publish here one of the
  111. "incomplete" (albeit very good) solutions.
  112.      The solution cracks the scheme but requires a little work
  113. of your part to accomplish it... what I mean is this: studying
  114. the following you'll be able to crack every Instant access
  115. protected code in a couple of hours, not immediatly... this is
  116. good, will make the lazy lurkers work (at least a little :=)
  117.      Here it is (C++ code of the solution and admission letter),
  118. I only took off the name of the candidate: 
  119.  
  120. <pre>
  121. Cracking Instant Access_____________
  122. by xxxxxxxx
  123. Application for 1996 Higher Cracking University
  124.  
  125.      This is my solution to the strainer for admittance into your
  126. HCU. While I was successful in bypassing the protection (and
  127. hence now have a nice collection of software for free) I am the
  128. first to admit that my solution is not the best. However, I am
  129. very proud of the work I have done on this project and it is by
  130. far the most difficult crack I've ever done. In the past I've
  131. traced programs, and when they did something I did not like, I
  132. looked at the jumps immediately before that and reversed them.
  133.      Because of idiot programming this worked about 60% of the
  134. time, however in many programs I was just stuck. With the hints
  135. you provided in your tutors I was able to actually disassemble
  136. the program and understand why it did things. Believe me this is
  137. a big jump. Anyway, here is my solution. 
  138.      I have dozens of handwritten notes and pages of code that
  139. I copied out of soft-ice, and any that are important I will type
  140. into this report, however most turned out to be unimportant. I
  141. have also created a "Magic" number generator and a reverse
  142. generator. I am very proud that I was able to create these,
  143. because the "Magic" number seemed so mysterious at first, and now
  144. I have complete mastery of it, a great feeling of power.    
  145.      I began the project by following the introductory steps in
  146. lessons C1 and C2. I got lost somewhere in C2, but I kept going.
  147. I got to the end with a vague understanding of what was happening
  148. and decided that I needed to understand this fully before I could
  149. do anything useful towards cracking it.  
  150.      I left my computer alone and read through the code again,
  151. making notes and explanations for my own use. About the third
  152. time through everything clicked, it was like a light bulb going
  153. off in my head. You mentioned that not everything in Lesson C1
  154. was correct. 
  155.      Here is a list of what I found to be incorrect. 
  156. 1. The offsets in the code were not the same. (this is a good
  157. idea to keep people from cheating when pinpointing the correct
  158. code)  
  159. 2. The pointers to where things are saved in memory were not the
  160. same. 
  161. 3. You wrote that the 1st digit plus 7 was saved and then you
  162. wrote that the 2nd plus 3 was saved. It is the other way around!
  163. 1st plus 3 and 2nd plus 7. (just checking if we are paying
  164. attention huh?) 
  165.      I think that's all of the one's I found although there were
  166. many specific instances of each one. So here's what I did. 
  167.      I did a search on the 18 digit code I typed in. I found it
  168. at 30:8xxxxx and did a bpr on it. I let it run, and looked each
  169. time something accessed that area. Eventually I found code that
  170. checked if the digits were between 30 and 39 and copied them to
  171. DS:8CD8. So there lies the code with the "-" 's stripped off of
  172. it.  I did a bpr on this area. It copied itself to DS:8CB8, and
  173. I bpr'ed that as well. I discovered that what was going on was,
  174. it copied itself, then that copy was transformed into the "Magic"
  175. number. 
  176.      So I did a little stack fishing, and found a CALL at offset
  177. 5C04 which copies the code from 8CB8 and converts it into the
  178. "Magic" number. At this point I traced into the call and got
  179. really fucking lost, so I stepped back had a sip of Vodka and
  180. thought. I don't care HOW the "magic" gets there, only that it
  181. is there. I figured once I figured out what "magic" I needed I
  182. could trace over the call that put it there, and then put in
  183. whatever "magic" I wanted. So I traced on to see what happened
  184. to the "magic" number that had been produced. I had a bpr on the
  185. "magic" and it stopped on the first line of code below. 
  186.      The code is copied from my handwritten notes, so not
  187. everything is accurate (I only wrote down what I thought was
  188. important) 
  189. 2b67:2598 mov  al, es:[bx]    ; 12th digit of magic
  190.           mov  [bp-03], al    ; ??????       
  191.           mov  al, [bp-03]    ; maybe an inefficient compiler
  192. result         
  193.           add  al, d0         ; clean it          
  194.           mov  [bp-04], al    ; save it in [8ca6] 
  195.           les  bx, bp+06           
  196.           add  bx, si         ; point to 12th again
  197.           mov  byte ptr es:bx, 30  ; make it a '0'          
  198.           push then more crap and then    
  199. :253d     mov  al, es:bx      ; 1st digit         
  200.           mov  ah, 00         add  ax,ffd0        ; clean it 
  201.           cwd                      
  202.           add [bp-06], ax          ; [8c90] is zero to start 
  203. this loop repeats 18 times, summing up the "magic" number, with
  204. the 12th set to 0    
  205.  
  206. :256e     mov  [bp-07], al    ; save remainder of sum/a in [8c8f]
  207.           cmp  [al, bp-05]    ; is 12th (in al) save as remainder
  208. of sum/a ? Aha!, this is what you were talking about at the end
  209. of C2, where the remainder doesn't match the 12th number. 
  210. I knew I was on the right track. I could feel it.      
  211. I traced down farther after the remainder check (I used
  212. 8888-8888-8888-8888-88 as my code from then on because it passed
  213. this check and was easy to remember) and I found code which
  214. compared the value at ds:8D00 with the value at ds:8D0C and if
  215. it did not match jumped to beggar off. 
  216.      Then it checks if ds:8D06 is equal to ds:8D0E and if not
  217. equal jumps to beggar off. So I knew that 8D00 must equal 8D0C
  218. and that 8D06 must equal 8D0E. 
  219.      All I needed to do was figure out where these came from. I
  220. bpr'ed on 8D0C and found code which wrote the number to it. 
  221.      I did not copy the ASM down, but this is what I wrote: 
  222. move 15th of "Magic" into AX  fix it to 0-9 by +- A    
  223. put it in SI   
  224. mov 16th into AX    
  225. mul si by A    
  226. add ax to si   
  227. mov 17th to AX      
  228. mul si by A    
  229. add ax to it   
  230. put 18th in AX      
  231. mul si by A    
  232. add AX to it   ; This is ds:8D0C !!!! 
  233. So now I knew where this came from, the last 4 digits of the
  234. "magic" I bpr'ed on 8D0E and found out quickly that the first
  235. digit of the "magic" was put into ds:8D0E. 
  236. Things were looking good. However, I was unable to figure out how
  237. ds:8D06 and ds:8D00 were created. I know they are related to the
  238. product code because they only change when it does. But they are
  239. put there by a MOVSW command and I cannot figure out how to
  240. predict where they are copied from, because it is only done once
  241. and it is never from the same place, so all my attempts to bpr
  242. on the spot they are copied from failed because it copies from
  243. a new spot each time. 
  244.      I felt dejected. I could not figure it out, even after days
  245. of pointless tracing.    
  246.      I stepped back and thought, and drank a can of Coke at 2
  247. a.m... 
  248. </pre>
  249. <i><br>
  250. (note from +ORC: Coke is dangerous for your health and your
  251. cracking purposes... drink only Martini-Wodka and use by all
  252. means only russian Wodka)</i><br><pre>
  253.  
  254.      ...I still had not figured out how the "magic" worked. I
  255. decided to do that and come back to the problem of the numbers
  256. generated from the Product Code. 
  257.      I knew the call at cs:5C04 completely generated the "magic"
  258. so I started there.  I traced through it several times and found
  259. that it made a CALL 3517 three times, then looped 6 times. So it
  260. called 3517 a total of 18 times. I also noticed that the CALL
  261. changed the number, but nothing else did, it just set up the
  262. calls. 
  263.      So I traced into CALL 3517 and came up with this:      
  264. mov  ax,ss     
  265. nop  inc  bp   
  266. push bp   
  267. mov  bp,sp     
  268. push ds   
  269. mov  ds,ax     
  270. xor  ax a bunch more unimportant stuff 
  271. :356b     mov  al,es:[bx}     ; al = 18th digit   
  272.           cbw  push ax   
  273.           mov  ax, A     
  274.           sub  ax,[5dad] ; subtract 6 from a to get 4  
  275.           imul [5db1]    pop  dx        ; 18th digit   
  276.           add  dx,ax     add  dx, -30   ;clean it      
  277.           mov  [5db5], dx     ;save it then fix [5db5] to be
  278. between 0 and 9     
  279.           mov  al, es:[bx]    ; load 18th again   
  280.           cbw  push      ax   
  281.           mov  ax,a      
  282.           sub  ax,[5dad]      
  283.           imul [5db3]    
  284.           pop  dx   ; 18th digit   
  285.           add  dx, ax    
  286.           add  dx, -30        ;clean it 
  287. :35bb     mov  [5db7], dx     ;save it. 
  288. :35d9     mov  bx,[5dad]      
  289.           mov  es, bp+1a      
  290.           add  bx,[bp+18]     
  291.           mov  al,es:[bx-1]   ; al = 6th digit    
  292.           mov  [5dc3], al     ; save it      
  293.           mov  bx,[5dad]      
  294.           mov  es,[bp+1e]     
  295.           add  bx,[bp+1c]     
  296.           mov  al,es:[bx-1]   ; 12th digit   
  297.           mov  [5dc4], al     ; save it more junk then 
  298. 3605:     mov  bx,[5dbf] ; this is the beginning of a loop
  299.           mov  es,[bp+1a]     
  300.           add  bx,[bp+18]     
  301.           mov  al,es:[bx-1]   ; 5th digit    
  302.           push ax        ; save it      
  303.           mov  ax,[5db5] ; [5db5] created above using 18th digit
  304.           mov  dx,A      
  305.           imul dx        ;[5db] *A      
  306.           les  bx,[bp+0c]     
  307.           add  bx,ax     
  308.           add  bx,[5db7] ; created using 18th     
  309.           pop  ax        ;5th digit     
  310.           sub  al,es:[bx};subtract a value from the lookup table
  311.           les  bx   add  bx,[5dbf]      
  312.           mov  es:[bx],al     ; Put new value in 6th spot fix it
  313. so that it's between 0 and 9 by +- A 
  314. :3656     mov  bx,[5dbf]      
  315.           mov  es,[bp+1e]     
  316.           add  bx,[bp+1c]     
  317.           mov  al,es:[bx-1]   ; 11th digit   
  318.           push ax   mov  ax,[5db5]      
  319.           mov  dx,a      
  320.           imul dx   
  321.           les  bx   
  322.           add  bx,ax     
  323.           add  bx,[5db7]      
  324.           pop  ax        ;11th digit    
  325.           sub  al,es:[bx]     ; subtract a value from lookup
  326. table     
  327.           les  bx, [bp+1c]    
  328.           add  bx,[5db7]      
  329.           mov  es:[bx],al     ;put it in 12th spot fix it to be
  330. between 0 and 9 The loop above repeats doing the same thing,
  331. changing 2 numbers, but not always the same two. The next time
  332. through it changes 5th and 11th, after that the 4th and 10th, 3rd
  333. and 9th then the 2nd and 8th using this same pattern. After the
  334. loop it changes the 1st and 7th using the values of the original
  335. 6th and 12th which were saved in [5dc3] and [5dc4] using the same
  336. pattern. I quickly wrote a program in C which would produce this
  337. number, and it worked fine. 
  338.      I traced into the second call of 3517 and found that the
  339. parameters passed to it changed which values where used to create
  340. [5db5] and [5db7], whether they increment or decrement, whether
  341. you add 0 or 64 to your index for the lookup and the digits which
  342. are changed. All three calls to 3517 have a different
  343. arrangement, but the their arrangement is the same each time they
  344. are called. For instance, the three calls are looped over 6
  345. times, on each instance that the 1st call is executed it will
  346. change the 6th,12th,5th, 11th, etc. So I modified my C program
  347. to mimic the behaviour of each call and looped it six times,
  348. expecting this to be the "magic" number. To my surprise it was
  349. not right. 
  350.      So I followed the code until after the 3 CALL 3517's had
  351. been made, this was the number my generator had given me, so it
  352. must do something more afterwards. 
  353.      I found the following code, still within the cs:5c04 call
  354. :44C1     mov  al,es:[bx+si-2]     ; 17th digit   
  355.           add  al,d0               ;clean it      
  356.           mov  [5dc1], al          ;save it  
  357.           les  bx   
  358.           mov  al,es:[bx+si-2]     ; 18th digit   
  359.           add  al,d0               ;clean it      
  360.           mov  [5dc2],al           ;save it  
  361.           mov  [5dbf],0  
  362.           jmp  455f :44df     
  363.           les  bx   
  364.           add  bx,[5dbf]      
  365.           mov  al,[5dc1]           ;17th cleaned  
  366.           sub  es:[bx],al          ;1st digit has 17th cleaned
  367. subtracted from it  fix it between 0 and 9   
  368.           mov  al,[5dc2] ;18th cleaned 4520  
  369.           sub  es:[bx],al     ;7th - 18th cleaned is put in 7th
  370. spot      fix it between 0 and 9 
  371. :455b     inc  word ptr [5dbf]     
  372.           mov  ax,[5dbf]      
  373.           cmp  ax,[5dad] ; run six times     
  374.           jge  456b      
  375.           jmp  44df 456b:  blah blah continue on. 
  376. This loop executes six times each time incrementing the digit to
  377. be changed by one so that the first change changes the 1st digit,
  378. and the next time through the loop the 2nd then the 3rd.....till
  379. the sixth. The second change alters the 7th through the 12th
  380. digits. I added code to do this at the end of my Generator, and
  381. I now had a "Magic" number generator. However this did not do me
  382. much good in itself. The breakthrough was reversing this program
  383. (it wasn't hard, but getting all the bugs out was really tough)
  384. so that it takes a "magic" number as input and tells you what
  385. registration number will produce it. I have included the source
  386. code for both programs to prove that they are my own work. The
  387. coding is not the best, they are my own crude tools, and they do
  388. the job I need them for. But now I am home free. Even without
  389. knowing how the product code is manipulated to come up with
  390. ds:8D00 and ds:8d06 I can crack it. Here's what I did.      
  391.      The product code given me was 3850-0118-6260-1057-23 I
  392. traced to where ds:8D00 and ds:8D06 are placed they were:   
  393. ds:8D00 = E03  ds:8D06 = 3 I knew the last 4 digits when added,
  394. and multiplied as explained above must be E03 so this is what I
  395. wrote down, using my calculator    
  396.      DFC + 7 =E03  
  397. This is the final answer, but I need to work backwards from here
  398.      166 * A = DFC  
  399.      15E + 8 = 166  
  400.      23 * A = 15E   
  401.      1E +5 = 23     
  402.      3 * A = 1E 
  403. Just working things backwards from the way the program did it I
  404. figured out the last 4 digits of the magic code need to be 3587
  405. in order for it to produce E03 as a result. I also know that the
  406. first digit must be equal to ds:8d06 which is 3 so I now have:
  407.      3___-____-____-__35-87        
  408. as a "magic" number and I fill it in with 1's     
  409.      3111-1111-111X-1135-87         
  410. I left the 12th number as an X because I remember that the
  411. remainder of the sum of all the digits except the 12th must be
  412. equal to the 12th. 
  413.      3+1+1+1+1+1+1+1+1+1+1+1+1+3+5+8+7 = 26 26/A 
  414.      26 26/A = 3 with a remainder of 8, 
  415. so the 12th digit is an 8! 
  416.      My "magic" number should be 3111-1111-1118-1135-87 
  417. So I run my UNINSTAN program, which tells me that in order to get
  418. that "magic" I need to enter the following registration code:
  419. 4798-8540-6989-6899-53 I enter this in, the "Retrieve" button is
  420. enabled and I install Norton Utilities without a hassle! I used
  421. the same method to install Wine Select (I've been interested in
  422. wine since reading about your Pomerol), Labels Unlimited (which
  423. I use for what else? Barcodes!), Harvard Graphics, and Lotus Ami
  424. Pro, which I'm using to write this report on!     
  425.      Well, that's it. That is how I cracked Instant Access. As
  426. I mentioned above it is not the best way, but I gave everything
  427. I had and it's the best I could do. 
  428.      I have succeeded because I have beaten the protection, and
  429. because I taught myself a lot along the way. I'm sure you already
  430. have a "magic" number generator of your own, but I included mine
  431. so you could see it. If I just knew how the product code produces
  432. those 2 numbers I could create a product code to registration
  433. number converter, which I assume is what the operators at Instant
  434. Access have when you call them to buy stuff. 
  435.      One last note about this assignment. I know that you have
  436. realized that Instant Access was hard to find. I want to tell you
  437. how I got it, a bit a social engineering in itself. After
  438. searching every library and book/magazine store in the city I got
  439. on the Internet and asked. Nobody had it. 
  440.      So I found the Instant Access homepage. ... 
  441. </pre><br><i>
  442. (this will not be published, coz I, +ORC, do not want to expose
  443. my crackers, but the way this guy got hold of the protection
  444. scheme is in itself worth is access to the +HCU)
  445. </i><br><pre>
  446. ...So as you can see, I have gone to great lengths for admittance
  447. into your University, and I hope I have earned it. I am proud to
  448. wear my +
  449. </pre>
  450. <i>...address follows<br> 
  451. And here are the two C++ programs:<br></i> 
  452.  
  453. <pre>
  454. INSTANT.CPP-----------------------------------
  455. // Template for byte patch files
  456. #include <stdlib.h>
  457. #include <stdio.h>
  458. #include <graph.h> 
  459. #include <conio.h>
  460. #include <string.h>
  461.  
  462. void main()
  463. {   
  464.      char fix(char x);
  465.      char *t; //*stopstring
  466.      int  save1, save2,fdbf,fdbs, i;   
  467.      static int table[208] = {1,3,3,1,9,2,3,0, 9,0,4,3,8,7,4,4, 
  468.                5,2,9,0,2,4,1,5, 6,6,3,2,0,8,5,6,
  469.                8,9,5,0,4,6,7,7, 2,0,8,0,6,2,4,7,
  470.                4,4,9,5,9,6,0,6, 8,7,0,3,5,9,0,8,
  471.                3,7,7,6,8,9,1,5, 7,4,6,1,4,2,7,1,
  472.                3,1,8,1,5,3,3,1, 2,8,2,1,6,5,7,2,
  473.                5,9,9,8,2,9,3,0, 0,4,5,1,1,3,8,6,
  474.                1,1,9,0,2,5,5,5, 1,7,1,5,8,7,1,9,
  475.                8,7,7,4,4,8,3,0, 6,1,9,8,8,4,9,9,
  476.                0,7,5,2,3,1,3,8, 6,5,7,6,3,7,6,7,
  477.                4,2,2,5,2,4,6,2, 6,9,9,1,5,2,3,4,
  478.                4,0,3,5,0,3,8,7, 6,4,8,8,2,0,3,6,
  479.                9,0,0,6,9,4,7,2, 0,1,1,1,1,0,1} ;
  480.                
  481.           
  482.           //_clearscreen(_GCLEARSCREEN);
  483.           printf("Enter the 18 digit Reg code:  ");
  484.           gets(t);
  485.            
  486. for (i=1; i<=6 ; i++)
  487.      {         
  488.           save1 = t[5];       // save the sixth digit
  489.           save2 = t[11];      // save the twelfth digit
  490.           
  491.           fdbf = 0xFFC+t[17]-0x1000-0x30 ; // create [5db5]
  492.           if (fdbf < 0x0)
  493.                fdbf += 0xA;   // fix it if necessary
  494.           else if (fdbf >= 0xA)
  495.                fdbf -= 0xA;
  496.           fdbs = fdbf;                            // and [5db7]
  497.  
  498.           t[5] = t[4] - table[fdbf*0xA+fdbs] ;  // sixth number
  499.           t[5] = fix(t[5]);
  500.           
  501.           t[11] = t[10] - table[fdbf*0xA+fdbs+0x64]; // 12th
  502. number
  503.           t[11] = fix(t[11]);
  504.      
  505.           
  506.           fdbf -= 1;          // decrement
  507.           if (fdbf == -1)
  508.                fdbf = 9;
  509.           fdbs -= 1;
  510.           if (fdbs == -1)
  511.                fdbs = 9;                      
  512.           
  513.           t[4] = t[3] - table[fdbf*0xA+fdbs] ;  // 5th number
  514.           t[4] = fix(t[4]);
  515.           
  516.           t[10] = t[9] - table[fdbf*0xA+fdbs+0x64]; // 11th
  517. number
  518.           t[10] = fix(t[10]);
  519.           
  520.           fdbf -= 1;          // decrement
  521.           if (fdbf == -1)
  522.                fdbf = 9;
  523.           fdbs -= 1;
  524.           if (fdbs == -1)
  525.                fdbs = 9;          
  526.            
  527.           t[3] = t[2] - table[fdbf*0xA+fdbs] ;  // 4th number
  528.           t[3] = fix(t[3]);
  529.           
  530.           t[9] = t[8] - table[fdbf*0xA+fdbs+0x64]; // 10th number
  531.           t[9] = fix(t[9]);
  532.           
  533.           fdbf -= 1;          // decrement
  534.           if (fdbf == -1)
  535.                fdbf = 9;
  536.           fdbs -= 1;
  537.           if (fdbs == -1)
  538.                fdbs = 9;  
  539.           
  540.           t[2] = t[1] - table[fdbf*0xA+fdbs] ;  // 3rd number
  541.           t[2] = fix(t[2]);
  542.           
  543.           t[8] = t[7] - table[fdbf*0xA+fdbs+0x64]; // 9th number
  544.           t[8] = fix(t[8]);
  545.           
  546.           fdbf -= 1;          // decrement
  547.           if (fdbf == -1)
  548.                fdbf = 9;
  549.           fdbs -= 1;
  550.           if (fdbs == -1)
  551.                fdbs = 9;                    
  552.           
  553.           t[1] = t[0] - table[fdbf*0xA+fdbs] ;  // 2nd number
  554.           t[1] = fix(t[1]);
  555.           
  556.           t[7] = t[6] - table[fdbf*0xA+fdbs+0x64]; // 8th number
  557.           t[7] = fix(t[7]);
  558.           
  559.           fdbf -= 1;          // decrement
  560.           if (fdbf == -1)
  561.                fdbf = 9;
  562.           fdbs -= 1;
  563.           if (fdbs == -1)
  564.                fdbs = 9;  
  565.           
  566.           t[0] = save1 - table[fdbf*0xA+fdbs];    // first digit
  567.           t[0] = fix(t[0]);
  568.           t[6] = save2 - table[fdbf*0xA+fdbs+0x64]; // 7th digit
  569.           t[6] = fix(t[6]);                                    
  570.            
  571.      //puts(t);     
  572.      // end of first call
  573. ////////////////////////////////////////////////
  574.      
  575.           save1 = t[5];       // save the sixth digit
  576.           save2 = t[17];      // save the 18th digit
  577.           
  578.           fdbf = t[10]+0x4-0x30 ; // create [5db5] 
  579.           if (fdbf < 0x0)
  580.                fdbf += 0xA;   // fix it if necessary
  581.           else if (fdbf >= 0xA)
  582.                fdbf -= 0xA;
  583.                          
  584.           fdbs = t[9]+0x4-0x30;         // and [5db7]
  585.           if (fdbs < 0x0)
  586.                fdbs += 0xA;   // fix it if necessary
  587.           else if (fdbs >= 0xA)
  588.                fdbs -= 0xA;
  589.  
  590.                     
  591.           t[5] = t[4] - table[fdbf*0xA+fdbs] ;  // sixth number
  592.           t[5] = fix(t[5]);
  593.           
  594.           t[17] = t[16] - table[fdbf*0xA+fdbs+0x64]; // 18th
  595. number
  596.           t[17] = fix(t[17]);
  597.                
  598.           fdbf += 1;          // increment
  599.           if (fdbf == 10)
  600.                fdbf = 0;
  601.           fdbs += 1;
  602.           if (fdbs == 10)
  603.                fdbs = 0;                        
  604.            
  605.           t[4] = t[3] - table[fdbf*0xA+fdbs] ;  // 5th number
  606.           t[4] = fix(t[4]);
  607.           
  608.           t[16] = t[15] - table[fdbf*0xA+fdbs+0x64]; // 17th
  609. number
  610.           t[16] = fix(t[16]);
  611.           
  612.           fdbf += 1;          // increment
  613.           if (fdbf == 10)
  614.                fdbf = 0;
  615.           fdbs += 1;
  616.           if (fdbs == 10)
  617.                fdbs = 0;            
  618.           
  619.           t[3] = t[2] - table[fdbf*0xA+fdbs] ;  // 4th number
  620.           t[3] = fix(t[3]);
  621.           
  622.           t[15] = t[14] - table[fdbf*0xA+fdbs+0x64]; // 16th
  623. number
  624.           t[15] = fix(t[15]);
  625.           
  626.           fdbf += 1;          // increment
  627.           if (fdbf == 10)
  628.                fdbf = 0;
  629.           fdbs += 1;
  630.           if (fdbs == 10)
  631.                fdbs = 0;      
  632.           
  633.           t[2] = t[1] - table[fdbf*0xA+fdbs] ;  // 3rd number
  634.           t[2] = fix(t[2]);
  635.           
  636.           t[14] = t[13] - table[fdbf*0xA+fdbs+0x64]; // 15th
  637. number
  638.           t[14] = fix(t[14]);
  639.           
  640.           fdbf += 1;          // increment
  641.           if (fdbf == 10)
  642.                fdbf = 0;
  643.           fdbs += 1;
  644.           if (fdbs == 10)
  645.                fdbs = 0;                     
  646.           
  647.           t[1] = t[0] - table[fdbf*0xA+fdbs] ;  // 2nd number
  648.           t[1] = fix(t[1]);
  649.           
  650.           t[13] = t[12] - table[fdbf*0xA+fdbs+0x64]; // 14th
  651. number
  652.           t[13] = fix(t[13]);
  653.           
  654.           fdbf += 1;          // increment
  655.           if (fdbf == 10)
  656.                fdbf = 0;
  657.           fdbs += 1;
  658.           if (fdbs == 10)
  659.                fdbs = 0;    
  660.           
  661.           t[0] = save1 - table[fdbf*0xA+fdbs];    // first digit
  662.           t[0] = fix(t[0]);
  663.           t[12] = save2 - table[fdbf*0xA+fdbs+0x64]; // 13th
  664. digit
  665.           t[12] = fix(t[12]);                                  
  666.              
  667.      //puts(t);     
  668.      // end of second call
  669. ////////////////////////////////////////////////
  670.           
  671.       
  672.           save1 = t[11];      // save the 12th digit
  673.           save2 = t[17];      // save the 18th digit
  674.           
  675.           fdbf = t[1]+0x4-0x30 ; // create [5db5] 
  676.           if (fdbf < 0x0)
  677.                fdbf += 0xA;   // fix it if necessary
  678.           else if (fdbf >= 0xA)
  679.                fdbf -= 0xA;
  680.                
  681.           fdbs = t[2]+0x4-0x30;         // and [5db7]
  682.           if (fdbs < 0x0)
  683.                fdbs += 0xA;   // fix it if necessary
  684.           else if (fdbs >= 0xA)
  685.                fdbs -= 0xA;
  686.  
  687.                     
  688.           t[17] = t[16] - table[fdbf*0xA+fdbs] ;  // 18th number
  689.           t[17] = fix(t[17]);
  690.           
  691.           t[11] = t[10] - table[fdbf*0xA+fdbs+0x64]; // 12th
  692. number
  693.           t[11] = fix(t[11]);
  694.      
  695.           
  696.           fdbf += 1;          // increment
  697.           if (fdbf == 10)
  698.                fdbf = 0;
  699.           fdbs += 1;
  700.           if (fdbs == 10)
  701.                fdbs = 0;                        
  702.                 
  703.           t[16] = t[15] - table[fdbf*0xA+fdbs] ;  // 17th number
  704.           t[16] = fix(t[16]);
  705.           
  706.           t[10] = t[9] - table[fdbf*0xA+fdbs+0x64]; // 11th
  707. number
  708.           t[10] = fix(t[10]);
  709.           
  710.           fdbf += 1;          // increment
  711.           if (fdbf == 10)
  712.                fdbf = 0;
  713.           fdbs += 1;
  714.           if (fdbs == 10)
  715.                fdbs = 0;            
  716.           
  717.           t[15] = t[14] - table[fdbf*0xA+fdbs] ;  // 16th number
  718.           t[15] = fix(t[15]);
  719.           
  720.           t[9] = t[8] - table[fdbf*0xA+fdbs+0x64]; // 10th number
  721.           t[9] = fix(t[9]);
  722.           
  723.           fdbf += 1;          // increment
  724.           if (fdbf == 10)
  725.                fdbf = 0;
  726.           fdbs += 1;
  727.           if (fdbs == 10)
  728.                fdbs = 0;      
  729.           
  730.           t[14] = t[13] - table[fdbf*0xA+fdbs] ;  // 15th number
  731.           t[14] = fix(t[14]);
  732.           
  733.           t[8] = t[7] - table[fdbf*0xA+fdbs+0x64]; // 9th number
  734.           t[8] = fix(t[8]);
  735.           
  736.           fdbf += 1;          // increment
  737.           if (fdbf == 10)
  738.                fdbf = 0;
  739.           fdbs += 1;
  740.           if (fdbs == 10)
  741.                fdbs = 0;                     
  742.           
  743.           t[13] = t[12] - table[fdbf*0xA+fdbs] ;  // 14th number
  744.           t[13] = fix(t[13]);
  745.           
  746.           t[7] = t[6] - table[fdbf*0xA+fdbs+0x64]; // 8th number
  747.           t[7] = fix(t[7]);
  748.           
  749.           fdbf += 1;          // increment
  750.           if (fdbf == 10)
  751.                fdbf = 0;
  752.           fdbs += 1;
  753.           if (fdbs == 10)
  754.                fdbs = 0;    
  755.           
  756.           t[12] = save2 - table[fdbf*0xA+fdbs];   // 13th digit
  757.           t[12] = fix(t[12]);
  758.                
  759.           t[6] = save1 - table[fdbf*0xA+fdbs+0x64]; // 7th digit
  760.           t[6] = fix(t[6]);                                    
  761.            
  762.           
  763.      // end of third call
  764. ////////////////////////////////////////////////
  765.           
  766.  
  767.      }  // end of for loop  
  768.  
  769.      // Now we finish it up
  770.      save1 = t[16] + 0xD0 - 0x100;      // [5dc1]
  771.      save2 = t[17] + 0xD0 - 0x100;      // [5dc2]
  772.      
  773.      for (i=0; i<6; i++)
  774.           {
  775.                t[i] = t[i] - save1;
  776.                t[i] = fix(t[i]);
  777.                
  778.                t[i+6] = t[i+6] - save2;
  779.                t[i+6] = fix(t[i+6]);
  780.           }   
  781.           
  782.      printf("'Magic' code is:  ");
  783.      for (i=0; i<18 ;i++)   // output the string (only first 18)
  784.           putc(t[i], stdout); 
  785.      printf("\n\n Created by xxxxx for +Orc's HCU 1996");
  786.      
  787. }   // end of main()
  788.  
  789.  
  790. char fix(char x)
  791. {
  792.      if (x < '0')
  793.           x = x+0xA;
  794.           
  795.      else if (x > 0x39)
  796.           x -= 0xA;
  797.      
  798.      return x;
  799. }
  800.      
  801. ---------------------------------------------------
  802. UNINSTANT.CPP
  803.  
  804. #include <stdlib.h>
  805. #include <stdio.h>
  806. #include <graph.h> 
  807. #include <conio.h>
  808. #include <string.h>
  809.  
  810.  
  811. void main()
  812. {   
  813.      char fix(char x);
  814.      
  815.      char *t; 
  816.      int  save1, save2,fdbf,fdbs, i,q, fdbssave,fdbfsave;   
  817.      static int table[208] = {1,3,3,1,9,2,3,0, 9,0,4,3,8,7,4,4, 
  818.           5,2,9,0,2,4,1,5, 6,6,3,2,0,8,5,6,
  819.           8,9,5,0,4,6,7,7, 2,0,8,0,6,2,4,7,
  820.           4,4,9,5,9,6,0,6, 8,7,0,3,5,9,0,8,
  821.           3,7,7,6,8,9,1,5, 7,4,6,1,4,2,7,1,
  822.           3,1,8,1,5,3,3,1, 2,8,2,1,6,5,7,2,
  823.           5,9,9,8,2,9,3,0, 0,4,5,1,1,3,8,6,
  824.           1,1,9,0,2,5,5,5, 1,7,1,5,8,7,1,9,
  825.           8,7,7,4,4,8,3,0, 6,1,9,8,8,4,9,9,
  826.           0,7,5,2,3,1,3,8, 6,5,7,6,3,7,6,7,
  827.           4,2,2,5,2,4,6,2, 6,9,9,1,5,2,3,4,
  828.           4,0,3,5,0,3,8,7, 6,4,8,8,2,0,3,6,
  829.           9,0,0,6,9,4,7,2, 0,1,1,1,1,0,1} ; 
  830.                                    
  831. printf("Enter the 18 digit 'Magic' code:  ");
  832. gets(t);                                
  833.  
  834. save1 = t[16] + 0xD0 - 0x100;      // [5dc1]
  835. save2 = t[17] + 0xD0 - 0x100;      // [5dc2]
  836.  
  837. for (i=5; i>=0 ; i--)         // fix it before main loop
  838.      {
  839.           t[i] = t[i] +save1;
  840.           t[i] = fix(t[i]);
  841.           
  842.           t[i+6] = t[i+6] + save2;
  843.           t[i+6] = fix(t[i+6]);
  844.      }              
  845.   
  846. for (i=1; i<=6 ; i++)
  847. {
  848. // begin third call 
  849.      fdbf = 0x4+t[1]-0x30 ; // create [5db5]
  850.      if (fdbf < 0x0)
  851.           fdbf += 0xA;   // fix it if necessary
  852.      else if (fdbf >= 0xA)
  853.           fdbf -= 0xA;
  854.      fdbs = 0x4+t[2]-0x30 ; // create [5db7]
  855.      if (fdbs < 0x0)
  856.           fdbs += 0xA;   // fix it if necessary
  857.      else if (fdbs >= 0xA)
  858.           fdbs -= 0xA;
  859.                               
  860.      
  861.      save1 = t[6];       //save 7th
  862.      save2 = t[12];       // and 13th
  863.       
  864.      for (q=1; q<=5; q++)     // put [ ]'s where they were at end
  865. of loop
  866.      {
  867.           fdbf += 1;          // increment
  868.           if (fdbf == 10)
  869.                fdbf = 0;
  870.           fdbs += 1;
  871.           if (fdbs == 10)
  872.                fdbs = 0; 
  873.    } 
  874.     fdbssave = fdbs;
  875.     fdbfsave = fdbf;
  876.     
  877.     fdbf -= 1;          // decrement
  878.      if (fdbf == -1)
  879.           fdbf = 9;
  880.      fdbs -= 1;
  881.      if (fdbs == -1)
  882.           fdbs = 9;  
  883.         
  884.     t[6] = t[7] + table[fdbf*0xA+fdbs+0x64];      // 7th digit
  885.     t[6] = fix(t[6]);
  886.     
  887.     t[12] = t[13] + table[fdbf*0xA+fdbs];   // 13th digit
  888.     t[12] = fix(t[12]);
  889.     
  890.     fdbf -= 1;          // decrement
  891.      if (fdbf == -1)
  892.           fdbf = 9;
  893.      fdbs -= 1;
  894.      if (fdbs == -1)
  895.           fdbs = 9;  
  896.      
  897.      t[7] = t[8] + table[fdbf*0xA+fdbs+0x64];      // 8th digit
  898.     t[7] = fix(t[7]);
  899.     
  900.     t[13] = t[14] + table[fdbf*0xA+fdbs];   // 14th digit
  901.     t[13] = fix(t[13]);
  902.     
  903.     fdbf -= 1;          // decrement
  904.      if (fdbf == -1)
  905.           fdbf = 9;
  906.      fdbs -= 1;
  907.      if (fdbs == -1)
  908.           fdbs = 9;  
  909.      
  910.      t[8] = t[9] + table[fdbf*0xA+fdbs+0x64];      // 9th digit
  911.     t[8] = fix(t[8]);
  912.     
  913.     t[14] = t[15] + table[fdbf*0xA+fdbs];   // 15th digit
  914.     t[14] = fix(t[14]);
  915.     
  916.     fdbf -= 1;          // decrement
  917.      if (fdbf == -1)
  918.           fdbf = 9;
  919.      fdbs -= 1;
  920.      if (fdbs == -1)
  921.           fdbs = 9;                  
  922.                      
  923.     
  924.     t[9] = t[10] + table[fdbf*0xA+fdbs+0x64];      // 10th digit
  925.     t[9] = fix(t[9]);
  926.     
  927.     t[15] = t[16] + table[fdbf*0xA+fdbs];   // 16th digit
  928.     t[15] = fix(t[15]);
  929.     
  930.     fdbf -= 1;          // decrement
  931.      if (fdbf == -1)
  932.           fdbf = 9;
  933.      fdbs -= 1;
  934.      if (fdbs == -1)
  935.           fdbs = 9;  
  936.      
  937.      t[10] = t[11] + table[fdbf*0xA+fdbs+0x64];      // 11th
  938. digit
  939.     t[10] = fix(t[10]);
  940.     
  941.     t[16] = t[17] + table[fdbf*0xA+fdbs];   // 17th digit
  942.     t[16] = fix(t[16]);
  943.  
  944.     t[11] = save1 + table[fdbfsave*0xA+fdbssave+0x64];      //
  945. 12th digit
  946.     t[11] = fix(t[11]);
  947.     
  948.     t[17] = save2 + table[fdbfsave*0xA+fdbssave];   // 18th digit
  949.     t[17] = fix(t[17]);    
  950.     
  951. // end of third call     
  952.  
  953.  
  954. // begin second call     
  955.      fdbf = 0x4+t[10]-0x30 ; // create [5db5]
  956.      if (fdbf < 0x0)
  957.           fdbf += 0xA;   // fix it if necessary
  958.      else if (fdbf >= 0xA)
  959.           fdbf -= 0xA;
  960.      fdbs = 0x4+t[9]-0x30 ; // create [5db7]
  961.      if (fdbs < 0x0)
  962.           fdbs += 0xA;   // fix it if necessary
  963.      else if (fdbs >= 0xA)
  964.           fdbs -= 0xA;
  965.                               
  966.      
  967.      save1 = t[0];       //save first
  968.      save2 = t[12];       // and 13th
  969.       
  970.      for (q=1; q<=5; q++)     // put [ ]'s where they were at end
  971. of loop
  972.      {
  973.           fdbf += 1;          // increment
  974.           if (fdbf == 10)
  975.                fdbf = 0;
  976.           fdbs += 1;
  977.           if (fdbs == 10)
  978.                fdbs = 0;
  979.     } 
  980.     fdbssave = fdbs;
  981.     fdbfsave = fdbf;
  982.     
  983.     fdbf -= 1;          // decrement
  984.      if (fdbf == -1)
  985.           fdbf = 9;
  986.      fdbs -= 1;
  987.      if (fdbs == -1)
  988.           fdbs = 9;  
  989.         
  990.     t[0] = t[1] + table[fdbf*0xA+fdbs];      // 1st digit
  991.     t[0] = fix(t[0]);
  992.     
  993.     t[12] = t[13] + table[fdbf*0xA+fdbs+0x64];   // 13th digit
  994.     t[12] = fix(t[12]);
  995.     
  996.     fdbf -= 1;          // decrement
  997.      if (fdbf == -1)
  998.           fdbf = 9;
  999.      fdbs -= 1;
  1000.      if (fdbs == -1)
  1001.           fdbs = 9;  
  1002.      
  1003.      t[1] = t[2] + table[fdbf*0xA+fdbs];      // 2nd digit
  1004.     t[1] = fix(t[1]);
  1005.     
  1006.     t[13] = t[14] + table[fdbf*0xA+fdbs+0x64];   // 14th digit
  1007.     t[13] = fix(t[13]);
  1008.     
  1009.     fdbf -= 1;          // decrement
  1010.      if (fdbf == -1)
  1011.           fdbf = 9;
  1012.      fdbs -= 1;
  1013.      if (fdbs == -1)
  1014.           fdbs = 9;  
  1015.      
  1016.      t[2] = t[3] + table[fdbf*0xA+fdbs];      // 3rd digit
  1017.     t[2] = fix(t[2]);
  1018.     
  1019.     t[14] = t[15] + table[fdbf*0xA+fdbs+0x64];   // 15th digit
  1020.     t[14] = fix(t[14]);
  1021.     
  1022.     fdbf -= 1;          // decrement
  1023.      if (fdbf == -1)
  1024.           fdbf = 9;
  1025.      fdbs -= 1;
  1026.      if (fdbs == -1)
  1027.           fdbs = 9;                  
  1028.                      
  1029.     
  1030.     t[3] = t[4] + table[fdbf*0xA+fdbs];      // 4th digit
  1031.     t[3] = fix(t[3]); 
  1032.  
  1033.     t[15] = t[16] + table[fdbf*0xA+fdbs+0x64];   // 16th digit
  1034.     t[15] = fix(t[15]);
  1035.     
  1036.     fdbf -= 1;          // decrement
  1037.      if (fdbf == -1)
  1038.           fdbf = 9;
  1039.      fdbs -= 1;
  1040.      if (fdbs == -1)
  1041.           fdbs = 9;  
  1042.      
  1043.      t[4] = t[5] + table[fdbf*0xA+fdbs];      // 5th digit
  1044.     t[4] = fix(t[4]);
  1045.     
  1046.     t[16] = t[17] + table[fdbf*0xA+fdbs+0x64];   // 17th digit
  1047.     t[16] = fix(t[16]);
  1048.  
  1049.     t[5] = save1 + table[fdbfsave*0xA+fdbssave];      // 6th
  1050. digit
  1051.     t[5] = fix(t[5]);
  1052.     
  1053.     t[17] = save2 + table[fdbfsave*0xA+fdbssave+0x64];   // 18th
  1054. digit
  1055.     t[17] = fix(t[17]);    
  1056. // end of second call      
  1057. // begin first call
  1058.      fdbf = 0xFFC+t[17]-0x1000-0x30 ; // create [5db5]
  1059.      if (fdbf < 0x0)
  1060.           fdbf += 0xA;   // fix it if necessary
  1061.      else if (fdbf >= 0xA)
  1062.           fdbf -= 0xA;
  1063.      fdbs = fdbf;                            // and [5db7]   
  1064.      
  1065.      save1 = t[0];       //save first
  1066.      save2 = t[6];       // and 7th
  1067.       
  1068.      for (q=1; q<=5; q++)     // put [ ]'s where they were at end
  1069. of loop
  1070.      {
  1071.           fdbf -= 1;          // decrement
  1072.           if (fdbf == -1)
  1073.                fdbf = 9;
  1074.           fdbs -= 1;
  1075.           if (fdbs == -1)
  1076.                fdbs = 9;
  1077.     } 
  1078.     fdbssave = fdbs;
  1079.     fdbfsave = fdbf;
  1080.     
  1081.     fdbf += 1;          // increment
  1082.      if (fdbf == 10)
  1083.           fdbf = 0;
  1084.      fdbs += 1;
  1085.      if (fdbs == 10)
  1086.           fdbs = 0;
  1087.         
  1088.     t[0] = t[1] + table[fdbf*0xA+fdbs];      // 1st digit
  1089.     t[0] = fix(t[0]);
  1090.     
  1091.     t[6] = t[7] + table[fdbf*0xA+fdbs+0x64];   // 7th digit
  1092.     t[6] = fix(t[6]);
  1093.     
  1094.     fdbf += 1;          // increment
  1095.      if (fdbf == 10)
  1096.           fdbf = 0;
  1097.      fdbs += 1;
  1098.      if (fdbs == 10)
  1099.           fdbs = 0;
  1100.      
  1101.      t[1] = t[2] + table[fdbf*0xA+fdbs];      // 2nd digit
  1102.     t[1] = fix(t[1]);
  1103.     
  1104.     t[7] = t[8] + table[fdbf*0xA+fdbs+0x64];   // 8th digit
  1105.     t[7] = fix(t[7]);
  1106.     
  1107.     fdbf += 1;          // increment
  1108.      if (fdbf == 10)
  1109.           fdbf = 0;
  1110.      fdbs += 1;
  1111.      if (fdbs == 10)
  1112.           fdbs = 0;
  1113.      
  1114.      t[2] = t[3] + table[fdbf*0xA+fdbs];      // 3rd digit
  1115.     t[2] = fix(t[2]);
  1116.     
  1117.     t[8] = t[9] + table[fdbf*0xA+fdbs+0x64];   // 9th digit
  1118.     t[8] = fix(t[8]);
  1119.     
  1120.     fdbf += 1;          // increment
  1121.      if (fdbf == 10)
  1122.           fdbf = 0;
  1123.      fdbs += 1;
  1124.      if (fdbs == 10)
  1125.           fdbs = 0;                 
  1126.                      
  1127.     
  1128.     t[3] = t[4] + table[fdbf*0xA+fdbs];      // 4th digit
  1129.     t[3] = fix(t[3]);
  1130.     
  1131.     t[9] = t[10] + table[fdbf*0xA+fdbs+0x64];   // 10th digit
  1132.     t[9] = fix(t[9]);
  1133.     
  1134.     fdbf += 1;          // increment
  1135.      if (fdbf == 10)
  1136.           fdbf = 0;
  1137.      fdbs += 1;
  1138.      if (fdbs == 10)
  1139.           fdbs = 0;
  1140.      
  1141.      t[4] = t[5] + table[fdbf*0xA+fdbs];      // 5th digit
  1142.     t[4] = fix(t[4]);
  1143.     
  1144.     t[10] = t[11] + table[fdbf*0xA+fdbs+0x64];   // 11th digit
  1145.     t[10] = fix(t[10]);
  1146.  
  1147.     t[5] = save1 + table[fdbfsave*0xA+fdbssave];      // 6th
  1148. digit
  1149.     t[5] = fix(t[5]);
  1150.     
  1151.     t[11] = save2 + table[fdbfsave*0xA+fdbssave+0x64];   // 12th
  1152. digit
  1153.     t[11] = fix(t[11]);
  1154. // end of first call
  1155. }  // end for loop
  1156.  
  1157. printf("\nTo Get That 'Magic' Use:  ");
  1158. for (i=0; i<18 ;i++)   // output the string (only first 18)
  1159.           putc(t[i], stdout); 
  1160.      printf("\n\n Created by +xxxxx for +Orc's HCU 1996");
  1161.      
  1162. }  // end of main()      
  1163.  
  1164.  
  1165. char fix(char x)
  1166. // fixes chars to between 0 and 9
  1167. {
  1168.      if (x < '0')
  1169.           x = x+0xA;
  1170.           
  1171.      else if (x > 0x39)
  1172.           x -= 0xA;
  1173.      
  1174.      return x;
  1175. }
  1176. </pre>
  1177. III. THE [DATADUMP_WINDOW] TRICK & HOW TO SEARCH THE WEB.
  1178.  
  1179. [WINFORMANT 4 HOW TO FIND IT]
  1180.      I have chosen (as usual) an older windows application for
  1181. Win 3.1. (Version 1.10, by Joseph B. Albanese), in order to
  1182. terminate completely the "password lessons" and at the same time
  1183. show you a nice little trick that can be very useful in cracking
  1184. *ALL* protected programs (password protected or time protected
  1185. or function disabled): memory windows_dumping. There is in almost
  1186. all protection routines, as you have already learned, a moment
  1187. when on the stack appears the ECHO of the real, "correct"
  1188. passnumber or password, in order to compare the input of the user
  1189. with it. 
  1190.      The location of this ECHO varies, but it will be most of the
  1191. time in a range of +- 0x90 bytes from the user input. This is due
  1192. to datadump windows restraints inside the tools used by the
  1193. protectionists I'll not delve inside here, and this use is bound
  1194. to diminish (especially after this lesson :=).
  1195.      You'll find the files that I use in this lesson searching
  1196. the web with the usual search_tools and search_strategies: These
  1197. are names, lengths and dates of the relevant files... this will
  1198. allow you to FTPMAIL them after having located them through an
  1199. ARCHIE_search: 
  1200.           CTL3D    DLL     20976 17/08/93    4:36
  1201.           README   WRI      2688 08/05/94    1:54
  1202.           SS3D2    VBX     88096 11/06/92   18:42
  1203.           STDLL    DLL     10880 06/05/94   22:57
  1204.           THREED   VBX     64432 17/07/93    0:00
  1205.           WIN4MANT EXE    562271 07/06/96   17:51
  1206.           WIN4MANT HLP    190608 08/05/94    0:36
  1207.           XLIST    VBX     15248 15/02/93    0:00
  1208.  
  1209.       Please do not underestimate the importance of *EXACT NAMES*
  1210. on the Web (be it of people, of subjects or of software)... as
  1211. a matter of fact the Web corroborates (every day more). The old
  1212. intuition from Persio: NOMEN ATQUE OMEN: how true! Think a moment
  1213. about it, the importance of the NAMES on the Web is astonishing
  1214. (and growing)!
  1215.      1) It is true for http://... addresses: domains must be
  1216. unique and registered (and the Web registration burocrats will
  1217. get from you 100 dollars per year just to keep them registered);
  1218. 2) It is true for programs (you must know BEFOREHAND the name of
  1219. a file to find it quickly on the Web); 3) It's even true for your
  1220. own site denomination (try searching for "Bill's" page instead
  1221. than for "WIKKY_WAKKY's" page... that's (reversing this approach)
  1222. one of the reason I have a "+" inside my handle, this confuses
  1223. the search engines just enough to give me a little more anonymity
  1224. (search for me! You'll get quite a lot of Warcraft stuff :=). 
  1225.      Enough! If you do not know neither why all this happen nor
  1226. how to search the Web, but are interested in these matters (as
  1227. you should), study the web search engines themselves and read the
  1228. relevant help files (search AltaVista and WebCrawler for
  1229. "FTPMAIL", "WWW via e-mail", "AGORA", "search strategies" etc).
  1230.      It's amazing how few crackers (not to mention the lusers)
  1231. do actually read the help files of the search engines they are
  1232. using, which should be your bible (or the coran, or some other
  1233. crap, for all I care about religions), your alpha and omega! The
  1234. (growing) amount of junk on the Web makes your ability to search
  1235. effectively the little grains of interesting truths that are
  1236. escaping the growing heavy censorship of our enemies even more
  1237. important.
  1238.      Back to our [Winformant] cracking now, and back to our
  1239. stackdump window trick... here you are:
  1240.  
  1241. [WINFORMANT CRACKING]
  1242.      This application is -per se- absolutely crap, I doubt you'll
  1243. ever use it: this program is so primitive it must have been one
  1244. of the first crappy visual basic experiments made by his
  1245. programmer... but this [Winformant] program is nevertheless very
  1246. interesting for us coz it possesses a curious  (and pretty rare)
  1247. "deactivate" mode, i.e. you can "unregister" it on the fly if you
  1248. feel the need to... it beats me why the programmer wanted such
  1249. a feature inside... he was just probably collecting little
  1250. routines and mixing them without sound reasons. 
  1251.      This feature is as rare as useless, but it is worth for
  1252. cracking scholars that (should) investigate password algorithms
  1253. with valid and invalid codes without having to reinstall
  1254. everything only in order to delete previous valid codes.
  1255.      For your cracking exercises you should therefore choose
  1256. programs that have "REVERSIBLE" protections (like this
  1257. Winformant... very rare) or that can be re-registered a billion
  1258. times (that's a more frequent protection pattern). Programs that
  1259. keep the valid registration on *.ini or special files can also
  1260. be useful... you just need to change a couple of lines in these
  1261. files to restore the "unregistered" mode.
  1262.      The trick we'll use in this lesson: "password proximity", 
  1263. bases on the fact that the protectionists need to keep an eye on
  1264. their protection when they "build" it and have to *see* closely
  1265. the relationships between 
  1266. 1)   USER INPUT PASSNUMBER (i.e. the input registration number
  1267. that the user should have bought, but could be a fake bad guy
  1268. input)
  1269. 2)   USER INPUT TRANSFORMED (i.e. the result of the working of
  1270. the protectionist's algorithm on the user input passnumber) 
  1271. and the 
  1272. 3)   CORRECT PASSNUMBER ANSWER (The BINGO!) i.e., the Passnumber
  1273. calculated with some algorithm on the bases of the USER INPUT
  1274. NAME (the name of the user, eventually transformed in USER INPUT
  1275. TRANSFORMED). 
  1276.      In order to clear bugs these relationships must be
  1277. constantly checked when they prepare the protection... i.e. when
  1278. they are writing the protection code.
  1279.      Most of the time all these data will therefore dwell inside
  1280. a small stack... that means they will be "visible" in the SAME
  1281. "watchwindow" inside the protectionist's debugger... and they use
  1282. the same turbodebugger (or Winice) YOU are using! 
  1283.      This means that most of the time the "ECHO" will swell not
  1284. very far away from the USER INPUT. Therefore proceed as follows:
  1285.  
  1286. Fire Winice
  1287. Fire Winformant
  1288. Choose HELP
  1289. Choose REGISTRATION
  1290. Fill the registration fields 
  1291.      this is mine: "+ORC+ORC" as "Registrant"  
  1292.      and "12121212" as "Activation" code
  1293. CTRL+D              ;switch to Winice
  1294. task                ;let's see the names
  1295.  
  1296. :task
  1297. TaskName  SS:SP StackTop StackBot StackLow TaskDB  hQueue  Events
  1298. WINWORD   1AD7:85F2 4A52  8670      7532     1247    122F    0000
  1299. PROGMAN   1737:200A 0936  2070      1392     066F    07F7    0000
  1300. DISKOMAT *2C5F:6634 1D3C  6AC6      5192     2CB7    2C9F    0000
  1301.  
  1302. hwnd DISKOMAT       ;which window is getting the input?
  1303.  
  1304. :hwnd diskomat
  1305. WinHandle   Hqueue  QOwner    Class Name        Window Procedure
  1306. 0EB4(0)      2C9F    DISKOMAT  #32769            04A7:9E6B
  1307.  0F34(1)     2C9F    DISKOMAT  #32768            USER!BEAR306
  1308.  365C(1)     2C9F    DISKOMAT  #32770            2C3F:0BC6
  1309.   36BC(2)    2C9F    DISKOMAT  Button            2C3F:1CEA
  1310.   3710(2)    2C9F    DISKOMAT  Edit              2C3F:24BE
  1311.   3758(2)    2C9F    DISKOMAT  Edit              2C3F:24BE
  1312.   37A0(2)    2C9F    DISKOMAT  Button            2C3F:1CEA
  1313.   37E4(2)    2C9F    DISKOMAT  Button            2C3F:1CEA
  1314. ... and many more irrelevant windows.
  1315.  
  1316. bmsg relevant_window wm_gettext ;let's pinpoint the code, here 
  1317.      ;the relevant window is the first "edit" one (obviously),
  1318.      ;i.e. wHnd 3710 you could also use GetWindowsText or
  1319.      ;GetDlgItmText to locate the relevant routines
  1320.  
  1321. :bmsg 3710 wm_gettext           ;set breakpoint
  1322. CTRL+D                          ;run the babe
  1323. Break Due to BMSG 3710 WM_GETTEXT C=01
  1324.   Hwnd=3710 wParam=0050 lParam=2C5F629A msg=000D WM_GETTEXT
  1325. 2C3F:000024BE B82F2C            MOV     AX,2C2F
  1326.  
  1327. So! Now that we have pinpointed the code... let's snoop around
  1328. a little: first thing to do is a good stack command which, here,
  1329. will work OK (in other cracking sessions it may not -magic
  1330. involved- but do not worry: if it does not work immediately, just
  1331. pinpoint a little more... for instance on GetWindowText() (always
  1332. good) or do a BPRW diskomat (also very useful), and then try and
  1333. retry the stack... should this too fail to work, do search for
  1334. your input in memory (in the 30:0 lffffffff selector, as usual)
  1335. and breakpoint range on it with ReadWrite, and then stack, stack,
  1336. stack... till you get the "real" list of calls coming from your
  1337. babe's protection (in our example the babe's name is "DISKOMAT").
  1338.  
  1339. :stack
  1340. USER(19) at 073F:124C [?] through 073F:1239
  1341. CTL3D(02) at 2C3F:0D53 [?] through 2C3F:0D53
  1342. DISKOMAT(01) at 2C97:20B9 [?] through 2C97:20B9
  1343. DISKOMAT(01) at 2C97:3D94 [?] through 2C97:3D94
  1344. DISKOMAT(01) at 2C97:49E2 [?] through 2C97:4918
  1345. DISKOMAT(04) at 2C7F:EA20 [?] through 2C7F:EA20
  1346. USER(01) at 04A7:19BE [?] through USER!GETWINDOWTEXT
  1347. => CTL3D(02) at 2C3F:24BE [?] through 04A7:3A3Ca
  1348.  
  1349. Beautiful stack picture! Immediately BPX on 2C7F:EA20 (on your
  1350. computer the segment will differ, the offset will be the SAME).
  1351.  
  1352. 2C7F:EA20 9A25ABA704     CALL    USER!GETWINDOWTEXT
  1353. 2C7F:EA25 8E4608         MOV     ES,[BP+08]
  1354. 2C7F:EA28 26FFB42C02     PUSH    WORD PTR ES:[SI+022C]
  1355. 2C7F:EA2D 8D865CFF       LEA     AX,[BP+FF5C]
  1356. 2C7F:EA31 16             PUSH    SS
  1357. 2C7F:EA32 50             PUSH    AX
  1358. 2C7F:EA33 6A50           PUSH    50
  1359. 2C7F:EA35 9A25ABA704     CALL    USER!GETWINDOWTEXT
  1360. 2C7F:EA3A 8D46AE         LEA     AX,[BP-52]  ;load ptr "+ORC+ORC"
  1361. 2C7F:EA3D 16             PUSH    SS     ;save pointer segment
  1362. 2C7F:EA3E 50             PUSH    AX     ;save pointer offset
  1363. 2C7F:EA3F 9A768D872C     CALL    2C87:8D76   ;strlen "ORC+ORC"
  1364. 2C7F:EA44 83C404         ADD     SP,+04
  1365. 2C7F:EA47 3D2800         CMP     AX,0028
  1366. 2C7F:EA4A 762C           JBE     EA78
  1367. ...
  1368. 2C7F:EA78 8D442C         LEA     AX,[SI+2C]
  1369. 2C7F:EA7B FF7608         PUSH    WORD PTR [BP+08]
  1370. 2C7F:EA7B FF7608         PUSH    WORD PTR [BP+08]
  1371. 2C7F:EA7E 50             PUSH    AX
  1372. 2C7F:EA7F 9AE002772C     CALL    2C77:02E0
  1373. 2C7F:EA84 0BC0           OR      AX,AX
  1374. 2C7F:EA86 740F           JZ      EA97
  1375. 2C7F:EA88 687F2C         PUSH    2C7F
  1376. 2C7F:EA8B 68E4ED         PUSH    EDE4
  1377. 2C7F:EA8E 6A00           PUSH    00
  1378. 2C7F:EA90 6A00           PUSH    00
  1379. 2C7F:EA92 6A00           PUSH    00
  1380. 2C7F:EA94 E94501         JMP     EBDC
  1381. 2C7F:EA97 8D46AE         LEA     AX,[BP-52]  ;load ptr "+ORC+ORC"
  1382. 2C7F:EA9A 16             PUSH    SS     ;various algor on input
  1383. 2C7F:EA9B 50             PUSH    AX     ;we do not care
  1384. 2C7F:EA9C 8D860AFF       LEA     AX,[BP+FF0A]
  1385. 2C7F:EAA0 16             PUSH    SS
  1386. 2C7F:EAA1 50             PUSH    AX
  1387. 2C7F:EAA2 6A51           PUSH    51
  1388. 2C7F:EAA4 8D442C         LEA     AX,[SI+2C]
  1389. 2C7F:EAA7 FF7608         PUSH    WORD PTR [BP+08]
  1390. 2C7F:EAAA 50             PUSH    AX
  1391. 2C7F:EAAB 9ABA00772C     CALL    2C77:00BA
  1392. 2C7F:EAB0 0BC0           OR      AX,AX
  1393. 2C7F:EAB2 0F851101       JNE     EBC7
  1394. 2C7F:EAB6 8D8E5CFF       LEA     CX,[BP+FF5C]  ;ptr "12121212"
  1395. 2C7F:EABA 16             PUSH    SS
  1396. 2C7F:EABB 51             PUSH    CX
  1397. 2C7F:EABC 9A768D872C     CALL    2C87:8D76   ;strlen "12121212"
  1398. 2C7F:EAC1 83C404         ADD     SP,+04
  1399. 2C7F:EAC4 50             PUSH    AX
  1400. 2C7F:EAC5 8D865CFF       LEA     AX,[BP+FF5C]  ;ptr "12121212"
  1401. 2C7F:EAC9 16             PUSH    SS
  1402. 2C7F:EACA 50             PUSH    AX
  1403. 2C7F:EACB 8D860AFF       LEA     AX,[BP+FF0A] ...etc
  1404.  
  1405. OK, it's enough: now what obviously follows is to "algorithmize"
  1406. this second string, and somewhere, then, you'll have a compare
  1407. that checks and divides good guys from bad fellows.
  1408.  
  1409. BUT NOW IT'S ALSO THE MAGIC MOMENT OF THE ECHO! We know it, we
  1410. feel it: The echo is somewhere... what can we do to find it?
  1411. Should we search "12121212" in memory? No, look how many
  1412. locations we would find...
  1413.  
  1414. :s 30:0 lffffffff '12121212'
  1415. Pattern Found at 0030:0005AD6A
  1416. Pattern Found at 0030:0048AD6A
  1417. Pattern Found at 0030:007DED98
  1418. Pattern Found at 0030:007E25F8
  1419. Pattern Found at 0030:008E0FE1
  1420. Pattern Found at 0030:008E1433
  1421. Pattern Found at 0030:008E186F
  1422. Pattern Found at 0030:008E1904
  1423. Pattern Found at 0030:008E601A
  1424. Pattern Found at 0030:80509D6A
  1425. Pattern Found at 0030:8145AD6A
  1426. Pattern Not Found
  1427.  
  1428.      And now...should we look for all occurrences of this string
  1429. and get a memory dump of +- 0x90 around it till we find the
  1430. echo... that's not zen... that's boring, even if we know that the
  1431. relevant ones will ALWAYS be the ones that have MORE than
  1432. 80000000 in their "offset", i.e., in this case, only two:
  1433. Pattern Found at 0030:80509D6A
  1434. Pattern Found at 0030:8145AD6A
  1435.      But this procedure is not always true, and in other
  1436. protection there will be a proliferation of locations with the
  1437. aim of deterring casual crackers... clearly the above method is
  1438. no good... there must be some other way... YES THERE IS!
  1439.      THE LAST loading of the numeric input string in the code
  1440. (the one after the strlen count) is most of the time (exspecially
  1441. in Visual Basic and Delphy programs) the "right" one for our
  1442. cracking purposes, coz the protections follow (most of the time)
  1443. this pattern (remember that we are here inside a stack "heavy"
  1444. section of the code... if you want to crack higher I suggest you
  1445. read some good literature about stack working and stack magics
  1446. inside the 80386/80486/80586 processors).
  1447.      This is the usual sequence:
  1448.  
  1449.      LOAD NAME
  1450.      COUNT NAMELENGTH
  1451.      LOAD NAME_AGAIN
  1452.      TRANSFORM NAME
  1453.      LOAD PASSCODE
  1454.      COUNT PASSCODE_LENGTH
  1455.      LOAD PASSCODE_AGAIN
  1456.                     <- ECHO CHECK here
  1457.      TRANSFORM PASSCODE
  1458.                     <- ECHO CHECK here
  1459.      COMPARE TRANSFORMED_NAME WITH TRANSFORMED_PASSCODE
  1460.  
  1461.      So... what does this mean? This means that at line
  1462. 2C7F:EAC5 8D865CFF   LEA  AX,[BP+FF5C]  ;ptr "12121212"
  1463. you'll already have your echo somewhere... just dump the memory
  1464. around the pointer [BP+FF5C]:
  1465.  
  1466. :d 2c5f:61e8
  1467.  
  1468. 2C5F:61E8 
  1469. 02 62 2F 06 02 00 26 2E-A3 4E A3 4E 01 00 38 30  .b/...&..N.N..80
  1470. 33 37 2D 36 34 36 2D 33-38 33 36 00 01 06 02 00  37-646-3836.....
  1471. 2F 06 75 62 C3 2E B7 04-F2 24 2F 06 CE 6E 2F 06  /.ub.....$/..n/.
  1472. 49 00 5A 00 00 00 01 00-04 2C 2F 06 AE 24 36 62  I.Z......,/..$6b
  1473. 74 62 7A 2E B7 04 36 62-01 00 C2 62 2F 2C 26 2E  tbz...6b...b/,&.
  1474. 03 01 BA 0F AE 24 5F 02-C9 01 5E 02 BA 01 5F 02  .....$_...^..._.
  1475. 31 32 31 32 31 32 31 32-00 00 0C 00 BC 02 00 00  12121212........
  1476. 00 00 00 00 49 00 BA 0F-AE 24 F2 24 2F 06 00 00  ....I....$.$/...
  1477. AF 17 00 00 00 00 E2 5F-7A 62 FE FF 79 1B BA 0F  ......._zb..y...
  1478. 96 0B 01 00 02 4E 00 00-37 01 8A 62 D2 0F 8F 17  .....N..7..b....
  1479. 2F 06 00 00 00 00 37 01-98 62 20 10 16 03 2F 06  /.....7..b .../.
  1480. C2 62 2B 4F 52 43 2B 4F-52 43 00 0D AE 24 2F 06  .b+ORC+ORC...$/.
  1481.                                           2C5F:62A7 
  1482.  
  1483. and look... everybody is there! The stack pointers points in the
  1484. middle of this dump, at the string "12121212". 0x50 bytes before
  1485. is our good old ECHO (i.e. the CORRECT passnumber) and 0x50 bytes
  1486. afterwards is my beautiful input name "+ORC+ORC". 
  1487.      Therefore the "right" code for "+ORC+ORC" is 8037-646-3836.
  1488. It cannot be so easy! You'll protest. It is: this crap protection
  1489. is already cracked and hunderts of Visual Basic/Delphy schemes
  1490. are absolutely identical. 
  1491.      Now begins the hard work: if you really want to learn,
  1492. accomplish the following tasks:
  1493. -    First of all "Unregister" and find anew your own code for
  1494.      your own handle. *DO NOT* use serial numbers with any other
  1495.      name that your own handle.
  1496. -    Study the two coding algorithms, the one for the input name
  1497.      and the one for the input passnumber, this will be useful
  1498.      for ALL your future cracking sessions.
  1499. -    Find the compare locations, i.e. the code block that sets
  1500.      the two usual flags "good guy, you may move on" and "bad
  1501.      cracker, beggar off", and create a patch crack for this
  1502.      protection, that will allow anybody, with any name and any
  1503.      password number to get through.
  1504.  
  1505. Please accomplish all of the preceding tasks: once you do it
  1506. you'll have FINISHED the password protection schemes part of my
  1507. tutorial and you'll be able to pass over to the (very
  1508. interesting) world of disabled and crippled functions (all these
  1509. "demos" that do not save and do not print... I'll teach you how
  1510. to do it, starting in Februar 1997).
  1511.  
  1512. Well, that's it for this lesson, reader. Not all lessons of my
  1513. tutorial are on the Web.
  1514.      You 'll obtain the missing lessons IF AND ONLY IF you mail
  1515. me back (via anon.penet.fi) with some tricks of the trade I may
  1516. not know that YOU discovered. Mostly I'll actually know them
  1517. already, but if they are really new you'll be given full credit,
  1518. and even if they are not, should I judge that you "rediscovered"
  1519. them with your work, or that you actually did good work on them,
  1520. I'll send you the remaining lessons nevertheless. Your
  1521. suggestions and critics on the whole crap I wrote are also
  1522. welcomed.
  1523.  
  1524.      "If you give a man a crack he'll be hungry again
  1525.      tomorrow, but if you teach him how to crack, he'll
  1526.      never be hungry again"
  1527.  
  1528.      +ORC  526164@anon.penet.fi 
  1529.  
  1530.